package com.jierui.meter.frontend.service;

import org.springframework.data.domain.Page;

import java.util.List;
import java.util.Optional;

/**
 * Base Service
 */
public interface BaseService<DTO, DO, Param> {

    /**
     * 新增
     * @param dto 实体对象
     * @return 创建后的对象, 如果返回Optional.empty() 保存失败
     */
    Optional<DTO> insert(DTO dto);

    /**
     * 新增
     * @param dto 实体对象
     * @return 创建后的对象, 如果返回Optional.empty() 保存失败
     */
    Optional<DTO> insertSelective(DTO dto);

    /**
     * 批量插入
     * @param dto
     * @return
     */
    List<DTO> batchInsert(List<DTO> dto);

    /**
     *  逻辑删除实体
     * @param id 主键id
     */
    void deleteByPrimaryKey(Long id);

    /**
     * 更新实体(支持部分字段), Optional.empty()： 实体不存在
     * @param dto 实体对象
     * @return 更新后的实体
     */
    Optional<DTO> update(DTO dto);

    /**
     * 查询
     * @param id: 主键id
     * @return 信息
     */
    Optional<DTO> selectById(Long id);

    /**
     * 列表查询（不支持分页）
     * @return 查询结果集
     */
    List<DTO> select();

    /**
     * 列表查询（不支持分页）
     * @param param 查询条件
     * @return 查询结果集
     */
    List<DTO> select(Param param);

    /**
     * 列表查询（支持分页）
     * @param page 当前页
     * @param size 每页条数
     * @param param 查询条件
     * @return 查询结果集
     */
    Page<DTO> select(Integer page, Integer size, Param param);

    /**
     * do对象转dto对象
     * @param d do对象
     * @return dto对象
     */
    DTO do2Dto(DO d);

    /**
     * do对象转dto对象
     * @param dto dto对象
     * @return do对象
     */
    DO dto2Do(DTO dto);

    /**
     * 主键id
     * @param dto
     * @return dto对象主键id
     */
    Long getId(DTO dto);
}
